package cn.bugstack.domain.activity.service.trial.node;

import cn.bugstack.domain.activity.model.entity.MarketProductEntity;
import cn.bugstack.domain.activity.model.entity.TrialBalanceEntity;
import cn.bugstack.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import cn.bugstack.domain.activity.service.trial.AbstractGroupBuyMarketSupport;
import cn.bugstack.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
import cn.bugstack.types.design.framework.tree.StrategyHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
/*
* 复杂作业：
* 其实 TagNode 还可以在执行营销 MarketNode 前面执行，
* 判断人群标签如果不可见，那么也可以不执行计算营销优惠。
* 你可以尝试锻炼调整节点下。
* */
@Service
@Slf4j
public class TagNode extends AbstractGroupBuyMarketSupport<MarketProductEntity, DefaultActivityStrategyFactory.DynamicContext, TrialBalanceEntity> {

    @Resource
    private EndNode endNode;

    /*
    * （1）首先这里的tagId没有的情况下，就是所有人都可见、可参与
      （2）如果tagId存在，即意味着可能存在对应的一个人群标签；
            1）进而如果确认了该人群标签不存在，那么同（1）中一样，所有人都可见、可参与
            2）如果确认了该人群标签存在，则需要考虑用户是否属于这个人群；
                    ①用户不属于这个人群，那么按照tag_scope的规则给出结果
                    ②用户属于这个人群么情况同（1）
    * */
    @Override
    protected TrialBalanceEntity doApply(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
        // 获取拼团活动配置
        GroupBuyActivityDiscountVO groupBuyActivityDiscountVO = dynamicContext.getGroupBuyActivityDiscountVO();

        String tagId = groupBuyActivityDiscountVO.getTagId();
//        String tagScope = groupBuyActivityDiscountVO.getTagScope();   // 2-7 不需要了
        boolean visible = groupBuyActivityDiscountVO.isVisible();
        boolean enable = groupBuyActivityDiscountVO.isEnable();
        boolean marketable = groupBuyActivityDiscountVO.isMarketable();

        // 人群标签配置为空，则走默认值 （1）首先这里的tagId没有的情况下，就是所有人都可见、可参与
        if(StringUtils.isBlank(tagId)){
            dynamicContext.setVisible(visible);
            dynamicContext.setEnable(enable);
            return router(requestParameter, dynamicContext);
        }

        // 是否在人群范围内；visible、enable 如果值为 ture 则表示没有配置拼团限制，那么就直接保证为 true 即可
        boolean isWithin = repository.isTagCrowdRange(tagId, requestParameter.getUserId());
        dynamicContext.setVisible(visible || isWithin);
        dynamicContext.setEnable(enable || isWithin);

        return router(requestParameter, dynamicContext);
    }

    @Override
    public StrategyHandler<MarketProductEntity, DefaultActivityStrategyFactory.DynamicContext, TrialBalanceEntity> get(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) {

        return endNode;
    }
}
